package org.study.springboot.learning.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者模式
 * 观察者模式也叫作发布-订阅模式，也就是事件监听机制。
 * 观察者模式定义了一种一对多的依赖关系，让多个观察者对象同时监听某一个主题对象，
 * 这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。
 *
 * 观察者模式结构：
 * 一个软件系统常常要求在某一个对象状态发生变化时，某些其他的对象作出相应的改变
 * 能做到这一点的设计方案有很多，但是为了使系统能够易于复用，应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用，
 * 但是同时需要使这些低耦合度的对象之间能够维持行动的协调一致，保证高度的协作。观察者模式是满足这一要求的各种设计方案中最重要的一种。
 * 1。抽象主题角色：所有的观察者对象应用保存在集合中，每个主题都有任意个观察者，主题提供观察者的添加与删除方法
 * 2.具体主题角色：将有关状态存入到具体的角色中，当具体角色状态发生改变时，给所有的登记观察者发出通知
 * 3.抽象观察角色：为观察者提供一个借口，在得到主题时更新自己
 * 4.观察者实体：存储与主题状态相关的状态。具体观察者实现抽象观察者所要求的更新方法，以便观察者与主题状态协调
 */
public abstract class Subject {

    //保存注册的观察者集合
    private List<Observer> list = new ArrayList<>();

    //注册观察者
    public void attach(Observer observer) {
        list.add(observer);
    }
    //移除观察者
    public void detach(Observer observer) {
        list.remove(observer);
    }

    //通知观察者所有的进行更新
    public void notifyObserver(String newState) {
        for (int i = 0; i < list.size(); i++) {
            list.get(i).update(newState);

        }
    }


}
